/*
*********************************************************************************************************
*
*	模块名称 : 按键驱动模块
*	文件名称 : bsp_key.c
*	版    本 : v1.0.00
*	说    明 : 
*
*********************************************************************************************************
*/

#include "bsp.h"

/* 长按时间=N*10ms */
#define LONG_KEY_TIME 100

/* 驱动引脚定义 */
#define USER_KEY_PORT GPIOC
#define USER_KEY_PIN GPIO_Pins_13
#define USER_KEY_GPIO_RCC_CLK RCC_AHBPERIPH_GPIOC
/* 读按键口线状态 */
#define USER_KEY_READ() ((USER_KEY_PORT->IPTDT & USER_KEY_PIN) != 0)

/*
*********************************************************************************************************
*	函 数 名: bsp_InitKey
*	功能说明: 配置用户按键相关的GPIO
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitKey(void)
{
    GPIO_InitType GPIO_InitStructure;

    /* GPIO Ports Clock Enable */
    RCC_AHBPeriphClockCmd(USER_KEY_GPIO_RCC_CLK, ENABLE);

    /* Configure the KEY pin as input */
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pins = USER_KEY_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_Pull = GPIO_Pull_NOPULL; /* 开发板已外置上拉 */
    GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
    GPIO_Init(USER_KEY_PORT, &GPIO_InitStructure);
}

/*
*********************************************************************************************************
*	函 数 名: Key_Driver
*	功能说明: 按键驱动，需要周期性调用，推荐10ms频率
*	形    参: 无
*	返 回 值: N_KEY：无键  S_KEY：单键  L_KEY：长按
*********************************************************************************************************
*/
uint8_t Key_Driver(void)
{
    static uint8_t ucKeyState = 0, ucKeyTime = 0;

    switch (ucKeyState)
    {
    case 0: /* 状态0 */
        if (!USER_KEY_READ())
        {
            ucKeyState = 1;
        }
        else
        {
            return N_KEY;
        }
        break;

    case 1: /* 状态1 */
        if (!USER_KEY_READ())
        {
            ucKeyTime = 0;
            ucKeyState = 2;
        }
        else
        {
            ucKeyState = 0;
            return N_KEY;
        }
        break;

    case 2: /* 状态2 */
        if (USER_KEY_READ())
        {
            ucKeyState = 0;
            return S_KEY;
        }
        else if (ucKeyTime >= LONG_KEY_TIME - 2) /* 减掉前两个状态时间 */
        {
            ucKeyState = 3;
            return L_KEY;
        }
        else
        {
            ucKeyTime++;
        }
        break;

    case 3: /* 状态3 */
        if (USER_KEY_READ())
        {
            ucKeyState = 0;
        }
        break;

    default:
        break;
    }

    return N_KEY;
}

/********************************************* End of file **********************************************/
